# -*- coding: utf-8 -*-

"""
  @author: tangliqi
  @date: 2022/9/30 16:58
  @python version: 3.6 
  
  ---------------------------------------
  @desc: python设计模式实现 => 桥接模式.py
"""
from abc import ABC, abstractmethod


# 通过一个手机的例子来实现桥接模式模式
# 在手机中，我们有品牌、颜色、配置等多个维度，每个维度之间是独立变化的。
# 假设我们有两个品牌，两种颜色，两种配置，如果通过继承的方式表达所有的手机，需要2x2x2=8种类才能表示所有的手机。
# 而通过桥接模式，使用组合的方式，我们只需要品牌、颜色、配置3种类总计6个类就能表示所有的手机，并且可以很方便的替换各个维度。

# ============================  颜色类  ============================
class Color(ABC):
    @abstractmethod
    def get_color(self):
        """打印颜色"""
        raise NotImplementedError("要实现")


class Blue(Color):
    def get_color(self):
        print("blue")


class Red(Color):
    def get_color(self):
        print("red")


# ============================  品牌类  ============================
class Brand(ABC):
    @abstractmethod
    def get_brand(self):
        """打印品牌"""
        raise NotImplementedError("要实现")


class HuaWei(Brand):
    def get_brand(self):
        print("华为手机")


class Apple(Brand):
    def get_brand(self):
        print("苹果手机")


# ============================  配置类  ============================
class Configuration(ABC):
    @abstractmethod
    def get_config(self):
        """打印配置"""
        raise NotImplementedError("要实现")


class Pro(Configuration):
    def get_config(self):
        print("4核8g")


class Max(Configuration):
    def get_config(self):
        print("8核16g")


# ============================  实现类  ============================
class Phone:
    def __init__(self, color: Color, brand: Brand, config: Configuration):
        self.color = color
        self.brand = brand
        self.config = config

    def show_phone(self):
        """展示手机"""
        self.color.get_color()
        self.brand.get_brand()
        self.config.get_config()


if __name__ == "__main__":
    # 手机1
    phone1 = Phone(Blue(), HuaWei(), Max())
    phone1.show_phone()

    # 手机2
    phone2 = Phone(Red(), Apple(), Max())
    phone2.show_phone()
